GitHub Actions の変数を管理する仕組みには「環境変数」と「構成変数」の2つがある

GitHub Actions の変数を管理する仕組みには「環境変数」と「構成変数」の2つがある

Clock Icon2024.11.15

こんにちは、製造ビジネステクノロジー部の若槻です。

GitHub Actions には、変数を管理する仕組みとして環境変数 (Environment Variables)構成変数 (Configuration Variables) があります。

それぞれ次のようなスコープの変数が利用可能です。

  • 環境変数 (Environment Variables)
    • ワークフロー (Workflow)
    • ジョブ (Job)
    • ステップ (Step)
  • 構成変数 (Configuration Variables)
    • 組織 (Organization)
    • リポジトリ (Repository)
    • 環境 (Environment)

これら 2 つの機能は名前や概念が似ており紛らわしかったので今回整理してみました。

環境変数

環境変数 (Environment Variables) は単一のワークフロー内で利用する変数の管理に使用する機能で、env キーを使用して定義およびアクセスが可能です。

環境変数には次の 3 つのスコープがあります。異なるスコープに同じ名前の変数がある場合は狭いスコープの変数が優先されます。

  • ワークフロー (Workflow)
  • ワークフロー内の特定のジョブ (Job)
  • ジョブ内の特定のステップ (Step)

下記はワークフロー、ジョブ、ステップのそれぞれで環境変数を定義してアクセスする例です。コメントに記載されている変数の値が出力されます。

.github/workflows/manual-test.yml
on: workflow_dispatch

env:
  MY_ENV_1: 'Workflow Environment Variable 1'
  MY_ENV_2: 'Workflow Environment Variable 2'

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      # Workflow Environment Variable 1
      - run: echo ${{ env.MY_ENV_1 }}

      # Step Environment Variable 1
      - run: echo ${{ env.MY_ENV_1 }}
        env:
          MY_ENV_1: 'Step Environment Variable 1'

  job2:
    runs-on: ubuntu-latest
    env:
      MY_ENV_1: 'Job Environment Variable 1'
    steps:
      # Job Environment Variable 1
      - run: echo ${{ env.MY_ENV_1 }}

      # Workflow Environment Variable 2
      - run: echo ${{ env.MY_ENV_2 }}

      # Step Environment Variable 1
      - run: echo ${{ env.MY_ENV_1 }}
        env:
          MY_ENV_1: 'Step Environment Variable 1'

参考

https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#defining-environment-variables-for-a-single-workflow

構成変数

構成変数 (Configuration Variables) は複数のワークフロー内で利用する変数の管理に使用する機能で、設定はそれぞれのスコープの管理画面から行い、ワークフロー内で vars キーを使用してアクセスが可能です。

構成変数が利用可能となったのは昨年 1 月とかなり最近で、現時点でもまだパブリックプレビューである比較的新しい機能となります。
https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables

構成変数には次の 3 つのスコープがあります。異なるスコープに同じ名前の変数がある場合は狭いスコープの変数が優先されます。

  • 組織 (Organization)
  • リポジトリ (Repository)
  • 環境 (Environment)

検証のために下記のように環境とリポジトリの構成変数を設定します。

  • Environments
    • DEVELOPMENT
      • MY_VAR_1Development Environment Variable 1
      • MY_VAR_2Development Environment Variable 2
  • Repository Variables
    • MY_VAR_1Repository Variable 1
    • MY_VAR_3Repository Variable 2

下記は構成変数にワークフローからアクセスする例です。コメントに記載されている変数の値が出力されます。

.github/workflows/manual-test.yml
on: workflow_dispatch

jobs:
  job1:
    environment: DEVELOPMENT
    runs-on: ubuntu-latest
    steps:
      # Development Environment Variable 1
      - run: echo ${{ vars.MY_VAR_1 }}

      # Development Environment Variable 2
      - run: echo ${{ vars.MY_VAR_2 }}

      # Repository Variable 2
      - run: echo ${{ vars.MY_VAR_3 }}

  job2:
    runs-on: ubuntu-latest
    steps:
      # Repository Variable 1
      - run: echo ${{ vars.MY_VAR_1 }}

      # null
      - run: echo ${{ vars.MY_VAR_2 }}

      # Repository Variable 2
      - run: echo ${{ vars.MY_VAR_3 }}

下記は VS Code で GitHub Actions extension に表示している各種構成変数が、ワークフローからのアクセスに対して対応するスコープの値が取得されている様子です。

参考

https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#defining-configuration-variables-for-multiple-workflows

構成変数と環境変数の関係

変数名が同じであっても、構成変数と環境変数の一方がもう一方を上書きすることはありません。

構成変数から環境変数に値を受け渡しする場合は、次のように GITHUB_ENV を使用して行います。

.github/workflows/manual-test.yml
on: workflow_dispatch

env:
  MY_ENV_1: 'Workflow Environment Variable 1'

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      # Workflow Environment Variable 1
      - run: echo ${{ env.MY_ENV_1 }}

      # 構成変数 MY_VAR_1 の値を、環境変数 MY_VAR_1 に設定
      - run: echo "${{vars.MY_VAR_1}}=$MY_VAR_1" >> $GITHUB_ENV

      # Repository Variable 1
      - run: echo ${{ env.MY_ENV_1 }}

おわりに

GitHub Actions の変数を管理する仕組みである「環境変数」と「構成変数」のご紹介でした。

「Environment Variables」と「(Configuration Variables)の Environment の Variables」という名称も用途も似通った概念があり、「envvars でどっちがどったいにアクセスできるんだっけ?」と迷うことがしばしばだったので、今回整理してみました。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.